pxContactGetPointNX#(body%, coll%)

Параметры

body% - тело
coll% - номер контакта

Описание

Возвращает координату X нормали контакта с номером Coll%

Смотрите так же

Пример

;пример использования функций
;pxContactGetPointNX

Graphics3D 800,600,32,2

AmbientLight 64,64,64
Global cam = CreateCamera()
CameraClsColor cam,25,30,70
PositionEntity cam,-5,13,-30
light= CreateLight()
RotateEntity light,20,50,0

;создаем физический мир
pxCreateWorld(0)
pxSetGravity(0, -100, 0)

;Создаем статичный уровень
level_mesh = LoadMesh("media\level.b3d")
ScaleMesh level_mesh,1,2,1

celltex = LoadTexture("media\Cell.bmp")
EntityTexture level_mesh,celltex
ScaleTexture celltex,.01,.01

;создаем физическую поверхность
level_body = CreateTrimeshMesh(level_mesh)

;создаем кубик
cube_body = pxCreateCube(5,5,5, 1)
pxSetPosition cube_body,10,6,0
pxSetRotation cube_body,0,0,90
cube_mesh=CreateCube ()
ScaleMesh cube_mesh,5,5,5

;cоздаем сферу
sphere_body = PxCreateSphere(10,1)
pxSetPosition sphere_body,14,25,0
sphere_mesh=CreateSphere()
ScaleMesh sphere_mesh,10,10,10


;грузим звук для столкновений и скольжения
Global snd = LoadSound("media\bounce.wav")

While Not(KeyHit(1))

;обсчитываем физический мир
    RenderPhysic(60,0)

;ставим визуальные тела позицию физических
    pxSetEntity cube_mesh,cube_body
    pxSetEntity sphere_mesh,sphere_body

    RenderWorld

    RenderContacts(sphere_body,255,0,0)
    RenderContacts(cube_body,0,255,0)

    Flip
Wend

Function RenderContacts(body,r%,g%,b%)
    ncoll = pxGetContacts(body)
    For i = 0 To ncoll-1
;сила нормального давления
        fx# = pxContactGetForceTX(body,i)
        fy# = pxContactGetForceTY(body,i)
        fz# = pxContactGetForceTZ(body,i)
        f# = Sqr(fx*fx+fy*fy+fz*fz)
;звук удара при скорости удара (по нормали) более 3
        vel# = pxContactGetForceN(body,i)
        If Abs(vel)>3
            chn = PlaySound(snd)
            ChannelVolume chn,Abs(vel)/15.0
        EndIf
;звук трения при скорости по касательной более 3
;(пусть будет тот же звук, но приглушенный)
        tvel# = pxContactGetForceT(body,i)
        If Abs(tvel)>.9
            chn = PlaySound(snd)
            ChannelVolume chn,Abs(tvel)/150.0
            ChannelPitch chn,4000
        EndIf
        Color r,g,b;255-f*50,f*50,f*50
;получаем координаты точки контакта...
        x# = pxContactGetPointX(body,i)
        y# = pxContactGetPointY(body,i)
        z# = pxContactGetPointZ(body,i)
        CameraProject cam,x,y,z
        sx# =ProjectedX():sy# =ProjectedY()
        Oval sx-2,sy-2,4,4
; ...и нормали.
; --------------- Применяем pxContactGetPointNX
        x# = x# + pxContactGetPointNX(body,i)
        y# = y# + pxContactGetPointNY(body,i)
        z# = z# + pxContactGetPointNZ(body,i)
        CameraProject cam,x,y,z
        sx2# =ProjectedX():sy2# =ProjectedY()
        CameraProject cam,x,y,z
        sx2# =ProjectedX():sy2# =ProjectedY()

        Color r,g,b
        Line sx,sy,sx2,sy2
        Color 255,255,255
    Next
End Function

Function CreateTrimeshMesh(mesh%)

    nsurf = CountSurfaces(mesh)
    nvert = 0
    nface=0
    For ns = 1 To nsurf
        Local surf = GetSurface(mesh,ns)
        nface = nface+CountTriangles(surf)
        nvert = nvert +CountVertices(surf)
    Next

    fbank = CreateBank(nface*4*3)
    nf = 0
    vbank = CreateBank(nvert*4*3)
    nv = 0
    For ns = 1 To nsurf
        surf = GetSurface(mesh,ns)
        nfv = CountTriangles(surf)
        For nfc = 0 To nfv -1
            PokeInt fbank,nf*12+0,TriangleVertex(surf,nfc,0)
            PokeInt fbank,nf*12+4,TriangleVertex(surf,nfc,1)
            PokeInt fbank,nf*12+8,TriangleVertex(surf,nfc,2)
            nf=nf+1
        Next

        nvv = CountVertices(surf)
        For nvc = 0 To nvv - 1
            PokeFloat vbank,nv*12+0,VertexX(surf,nvc)
            PokeFloat vbank,nv*12+4,VertexY(surf,nvc)
            PokeFloat vbank,nv*12+8,VertexZ(surf,nvc)
            nv = nv+1
        Next
    Next
    bbb%=pxCreateStaticTriMesh(vbank, fbank, nvert, nface)
    FreeBank vbank
    FreeBank fbank
    Return bbb%
End Function

К содержанию

Нажмите здесь чтобы увидеть последнюю версию этой странички в режиме online.